﻿namespace WPForms.Phone.Converters
{
    using System;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Ink;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Animation;
    using System.Windows.Shapes;

    /// <summary>
    /// Converter class, which supports converting strings into grid length structs.
    /// </summary>
    public class GridLengthConverter : IValueConverter
    {
        /// <summary>
        /// Modifies the source data before passing it to the target for display in the UI.
        /// </summary>
        /// <param name="value">The source data being passed to the target.</param>
        /// <param name="targetType">The <see cref="T:System.Type" /> of data expected by the target dependency property.</param>
        /// <param name="parameter">An optional parameter to be used in the converter logic.</param>
        /// <param name="culture">The culture of the conversion.</param>
        /// <returns>
        /// The value to be passed to the target dependency property.
        /// </returns>
        /// <exception cref="System.NotSupportedException">Only GridLength is supported</exception>
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (targetType != typeof(GridLength))
            {
                throw new NotSupportedException("Only GridLength is supported");
            }

            if (value == null)
            {
                return new GridLength(0, GridUnitType.Auto);
            }

            var stringValue = (string)value;
            if (string.Equals("auto", stringValue, StringComparison.OrdinalIgnoreCase))
            {
                return new GridLength(0, GridUnitType.Auto);
            }

            if (stringValue.Contains("*"))
            {
                double size = double.Parse(stringValue.Replace("*", string.Empty));
                return new GridLength(size, GridUnitType.Star);
            }

            double sizePixel = double.Parse(stringValue);
            return new GridLength(sizePixel, GridUnitType.Pixel);
        }

        /// <summary>
        /// Modifies the target data before passing it to the source object.  This method is called only in <see cref="F:System.Windows.Data.BindingMode.TwoWay" /> bindings.
        /// </summary>
        /// <param name="value">The target data being passed to the source.</param>
        /// <param name="targetType">The <see cref="T:System.Type" /> of data expected by the source object.</param>
        /// <param name="parameter">An optional parameter to be used in the converter logic.</param>
        /// <param name="culture">The culture of the conversion.</param>
        /// <returns>
        /// The value to be passed to the source object.
        /// </returns>
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}
